/***************************************************************************
 *   Copyright (c) 2008 Werner Mayer <wmayer[at]users.sourceforge.net>     *
 *                                                                         *
 *   This file is part of the FreeCAD CAx development system.              *
 *                                                                         *
 *   This library is free software; you can redistribute it and/or         *
 *   modify it under the terms of the GNU Library General Public           *
 *   License as published by the Free Software Foundation; either          *
 *   version 2 of the License, or (at your option) any later version.      *
 *                                                                         *
 *   This library  is distributed in the hope that it will be useful,      *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU Library General Public License for more details.                  *
 *                                                                         *
 *   You should have received a copy of the GNU Library General Public     *
 *   License along with this library; see the file COPYING.LIB. If not,    *
 *   write to the Free Software Foundation, Inc., 59 Temple Place,         *
 *   Suite 330, Boston, MA  02111-1307, USA                                *
 *                                                                         *
 ***************************************************************************/

#include "PreCompiled.h"

#include <Gui/Application.h>
#include <Gui/Command.h>
#include <Gui/Selection.h>
#include <Gui/ToolBarManager.h>

#include "Workbench.h"


using namespace WebGui;

#if 0  // needed for Qt's lupdate utility
    qApp->translate("Workbench", "Navigation");
#endif

/// @namespace WebGui @class Workbench
TYPESYSTEM_SOURCE(WebGui::Workbench, Gui::StdWorkbench)

Workbench::Workbench() = default;

Workbench::~Workbench() = default;

void Workbench::setupContextMenu(const char* recipient, Gui::MenuItem* item) const
{
    Q_UNUSED(recipient);
    Q_UNUSED(item);
    // if (strcmp(recipient,"View") == 0)
    //{
    //     Gui::MenuItem* StdViews = new Gui::MenuItem();
    //     StdViews->setCommand( "Standard views" );

    //    *StdViews << "Std_ViewAxo" << "Separator" << "Std_ViewFront" << "Std_ViewTop" <<
    //    "Std_ViewRight"
    //              << "Std_ViewRear" << "Std_ViewBottom" << "Std_ViewLeft";

    //    *item << "Std_ViewFitAll" << "Std_ViewFitSelection" << StdViews
    //          << "Separator" << "Std_ViewDockUndockFullscreen";

    //    if ( Gui::Selection().countObjectsOfType(App::DocumentObject::getClassTypeId()) > 0 )
    //        *item << "Separator" << "Std_SetAppearance" << "Std_ToggleVisibility" <<
    //        "Std_TreeSelection"
    //              << "Std_RandomColor" << "Separator" << "Std_Delete";
    //}
    // else if (strcmp(recipient,"Tree") == 0)
    //{
    //    if ( Gui::Selection().countObjectsOfType(App::DocumentObject::getClassTypeId()) > 0 )
    //        *item << "Std_SetAppearance" << "Std_ToggleVisibility"
    //              << "Std_RandomColor" << "Separator" << "Std_Delete";
    //}
}

Gui::MenuItem* Workbench::setupMenuBar() const
{
    return Gui::StdWorkbench::setupMenuBar();
    // Gui::CommandManager &mgr = Gui::Application::Instance->commandManager();
    //// Setup the default menu bar
    // Gui::MenuItem* menuBar = new Gui::MenuItem;

    //    // File
    //    Gui::MenuItem* file = new Gui::MenuItem( menuBar );
    //    file->setCommand("&File");
    //    *file << "Std_New" << "Std_Open" << "Separator" << "Std_CloseActiveWindow"
    //          << "Std_CloseAllWindows" << "Separator" << "Std_Save" << "Std_SaveAs"
    //          << "Separator" << "Std_Import" << "Std_Export" << "Std_ProjectInfo"
    //        //<< "Separator" << "Std_Print" << "Std_PrintPdf"
    //          << "Separator" << "Std_RecentFiles" << "Separator" << "Std_Quit";
    //
    //    // Edit
    //    Gui::MenuItem* edit = new Gui::MenuItem( menuBar );
    //    edit->setCommand("&Edit");
    //    *edit << "Std_Undo" << "Std_Redo" << "Separator" << "Std_Cut" << "Std_Copy"
    //          << "Std_Paste" << "Std_DuplicateSelection" << "Separator"
    //          << "Std_Refresh" << "Std_SelectAll" << "Std_Delete" << "Std_Placement"
    //          << "Separator" << "Std_DlgPreferences";
    //
    //    // Standard views
    //    Gui::MenuItem* stdviews = new Gui::MenuItem;
    //    stdviews->setCommand("Standard views");
    //    *stdviews << "Std_ViewFitAll" << "Std_ViewFitSelection" << "Std_ViewAxo"
    //              << "Separator" << "Std_ViewFront" << "Std_ViewRight"
    //              << "Std_ViewTop" << "Separator" << "Std_ViewRear"
    //              << "Std_ViewLeft" << "Std_ViewBottom";
    //
    //    // stereo
    //    Gui::MenuItem* view3d = new Gui::MenuItem;
    //    view3d->setCommand("&Stereo");
    //    *view3d << "Std_ViewIvStereoRedGreen" << "Std_ViewIvStereoQuadBuff"
    //            << "Std_ViewIvStereoInterleavedRows" << "Std_ViewIvStereoInterleavedColumns"
    //            << "Std_ViewIvStereoOff" << "Separator" << "Std_ViewIvIssueCamPos";
    //
    //    // zoom
    //    Gui::MenuItem* zoom = new Gui::MenuItem;
    //    zoom->setCommand("&Zoom");
    //    *zoom << "Std_ViewZoomIn" << "Std_ViewZoomOut" << "Separator" << "Std_ViewBoxZoom";
    //
    //    // Visibility
    //    Gui::MenuItem* visu = new Gui::MenuItem;
    //    visu->setCommand("Visibility");
    //    *visu << "Std_ToggleVisibility" << "Std_ShowSelection" << "Std_HideSelection"
    //          << "Separator" << "Std_ToggleObjects" << "Std_ShowObjects" << "Std_HideObjects";
    //
    //    // View
    //    Gui::MenuItem* view = new Gui::MenuItem( menuBar );
    //    view->setCommand("&View");
    //    *view << "Std_ViewCreate" << "Std_OrthographicCamera" << "Std_PerspectiveCamera" <<
    //    "Separator"
    //          << stdviews << "Std_FreezeViews" << "Separator" << view3d << zoom
    //          << "Std_ViewDockUndockFullscreen" << "Std_ToggleClipPlane" << "Separator" << visu
    //          << "Std_SetAppearance" << "Std_ToggleVisibility" << "Std_RandomColor" << "Separator"
    //          //<< "Std_MeasureDistance" << "Separator"
    //          << "Std_Workbench" << "Std_ToolBarMenu" << "Std_DockViewMenu" << "Separator"
    //          << "Std_ViewStatusBar" << "Std_UserInterface";
    //
    //    // Tools
    //    Gui::MenuItem* tool = new Gui::MenuItem( menuBar );
    //    tool->setCommand("&Tools");
    //    *tool << "Std_CommandLine" << "Std_DlgParameter" << "Separator" << "Std_DlgMacroRecord"
    //          << "Std_DlgMacroExecute" << "Std_DlgMacroExecuteDirect"
    //          << "Separator" << "Std_ViewScreenShot" << "Separator" << "Std_DlgCustomize";
    //
    //    // Mesh
    //    ****************************************************************************************************
    //    Gui::MenuItem* mesh = new Gui::MenuItem( menuBar );
    //
    //    // submenu analyze
    //    Gui::MenuItem* analyze = new Gui::MenuItem();
    //    analyze->setCommand("Analyze");
    //    *analyze << "Mesh_Evaluation"
    //             << "Mesh_EvaluateFacet"
    //             << "Mesh_CurvatureInfo"
    //             << "Separator"
    //             << "Mesh_EvaluateSolid"
    //             << "Mesh_BoundingBox";
    //
    //    // submenu boolean
    //    Gui::MenuItem* boolean = new Gui::MenuItem();
    //    boolean->setCommand("Boolean");
    //    *boolean << "Mesh_Union"
    //             << "Mesh_Intersection"
    //             << "Mesh_Difference";
    //
    //    mesh->setCommand("&Meshes");
    //    *mesh << "Mesh_Import"
    //          << "Mesh_Export"
    //          << "Mesh_FromGeometry"
    //          << "Separator"
    //          << analyze
    //          << "Mesh_HarmonizeNormals"
    //          << "Mesh_FlipNormals"
    //          << "Separator"
    //          << "Mesh_FillupHoles"
    //          << "Mesh_FillInteractiveHole"
    //          << "Mesh_RemoveComponents"
    //          << "Mesh_RemoveCompByHand"
    //          << "Separator"
    //          << "Mesh_BuildRegularSolid"
    //          << boolean << "Separator"
    //          << "Mesh_PolyCut"
    //          << "Mesh_PolySplit"
    //          << "Mesh_PolySegm"
    //          << "Mesh_ToolMesh"
    //          << "Mesh_VertexCurvature";
    //
    //    // Part
    //    ****************************************************************************************************
    //
    //    Gui::MenuItem* part = new Gui::MenuItem(menuBar);
    //    part->setCommand("&Part");
    //
    //    // submenu boolean
    //    Gui::MenuItem* para = new Gui::MenuItem();
    //    para->setCommand("Parametric");
    //    *para << "Part_Box"
    //          << "Part_Cylinder"
    //          << "Part_Sphere"
    //          << "Part_Cone"
    //          << "Part_Torus"
    //          << "Part_Primitives";
    //    *part << para
    //          << "Part_Boolean"
    //          << "Part_Extrude"
    //          << "Part_Revolve"
    //          << "Part_Fillet";
    //
    // #   ifdef WEB_SHOW_SKETCHER
    //    if (mgr.getCommandByName("Sketcher_NewSketch")) {
    //        Gui::MenuItem* sketch = new Gui::MenuItem(menuBar);
    //        sketch->setCommand("Ske&tch");
    //        *sketch
    //            << "Sketcher_NewSketch"
    //            << "Separator"
    //            << "PartDesign_Pad"
    //            << "PartDesign_Fillet"
    //        ;
    //    }
    // #   endif
    //
    //    // Drawing
    //    ****************************************************************************************************
    //
    //    Gui::MenuItem* drawing = new Gui::MenuItem(menuBar);
    //
    //    drawing->setCommand("&Drawing");
    //    *drawing
    //        << "Drawing_Open"
    //        << "Separator"
    //        << "Drawing_NewA3Landscape"
    //        << "Drawing_NewView"
    //        << "Drawing_ExportPage"
    //    ;
    //
    //    // Drafting
    //    ****************************************************************************************************
    // #   ifdef WEB_USE_DRAFTING
    //    if (mgr.getCommandByName("Draft_Line")) {
    //        Gui::MenuItem* Drafting = new Gui::MenuItem(menuBar);
    //
    //        Drafting->setCommand("&Drafting");
    //        *Drafting
    //            << "Draft_SelectPlane"
    //            << "Draft_Line"
    //            << "Draft_Polyline"
    //            << "Draft_Circle"
    //            << "Draft_Arc"
    //            << "Draft_Rectangle"
    //            << "Draft_Text"
    //            << "Draft_Dimension"
    //            << "Separator"
    //            << "Draft_Move"
    //            << "Draft_Rotate"
    //            << "Draft_Offset"
    //            << "Draft_Trimex"
    //            << "Draft_Upgrade"
    //            << "Draft_Downgrade"
    //            << "Draft_Scale"
    //            << "Separator"
    //            << "Draft_ApplyStyle"
    //        ;
    //    }
    // #   endif
    //
    //    // xxx
    //    ****************************************************************************************************
    //
    //
    //    // Windows
    //    Gui::MenuItem* wnd = new Gui::MenuItem( menuBar );
    //    wnd->setCommand("&Windows");
    //    *wnd << "Std_ActivateNextWindow" << "Std_ActivatePrevWindow" << "Separator"
    //         << "Std_TileWindows" << "Std_CascadeWindows" << "Separator"
    //         << "Std_WindowsMenu" << "Std_Windows";
    //
    //    // help
    //    ****************************************************************************************************
    //    // Separator
    //    Gui::MenuItem* sep = new Gui::MenuItem( menuBar );
    //    sep->setCommand( "Separator" );
    //
    //    // Help
    //    Gui::MenuItem* helpWebsites = new Gui::MenuItem;
    //    helpWebsites->setCommand("&Online-help");
    //    *helpWebsites << "Std_OnlineHelpWebsite"
    //                  << "Std_FreeCADWebsite"
    //                  << "Std_PythonWebsite";
    //
    //    Gui::MenuItem* help = new Gui::MenuItem( menuBar );
    //    help->setCommand("&Help");
    //    *help << "Std_OnlineHelp"
    //          << "Std_PythonHelp"
    //          << helpWebsites
    //          << "Separator"
    //          << "Test_Test"
    //          << "Separator"
    //          << "Std_About"
    //          << "Std_AboutQt"
    //          << "Separator"
    //          << "Std_WhatsThis" ;
    //
    //      return menuBar;
}

Gui::ToolBarItem* Workbench::setupToolBars() const
{
    Gui::ToolBarItem* root = StdWorkbench::setupToolBars();

    // web navigation toolbar
    Gui::ToolBarItem* navigation = new Gui::ToolBarItem(root);
    navigation->setCommand("Navigation");
    *navigation << "Web_BrowserSetURL"
                << "Separator"
                << "Web_OpenWebsite"
                << "Separator"
                << "Web_BrowserBack"
                << "Web_BrowserNext"
                << "Web_BrowserRefresh"
                << "Web_BrowserStop"
                << "Separator"
                << "Web_BrowserZoomIn"
                << "Web_BrowserZoomOut";

    return root;
}

Gui::ToolBarItem* Workbench::setupCommandBars() const
{
    Gui::ToolBarItem* root = new Gui::ToolBarItem;
    return root;
}

Gui::DockWindowItems* Workbench::setupDockWindows() const
{
    Gui::DockWindowItems* root = Gui::StdWorkbench::setupDockWindows();
    // root->setVisibility(false); // hide all dock windows by default
    // root->setVisibility("Std_ComboView",true); // except of the combo view
    return root;
}
